在 Python Tutor 當中, 只要你打入一段 Python 程式, 就可以一步步看它執行, 而且還有各個變數的變化。非常適合瞭解 Python 程式是怎麼運作的!
Jupyter Notebook 有個很酷的互動功能, 基本上任何有帶參數的式函都可以互動! 我們要用到的是
ipywidgets
中的 interact
函式。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact
我們來定義個超級簡單的函數。
def f(x):
print(x)
interact(f, x=3)
interactive(children=(IntSlider(value=3, description='x', max=9, min=-3), Output()), _dom_classes=('widget-int…
<function __main__.f(x)>
這樣數值滑桿就出現了!! 這樣不是浮點數, 有可能變成浮點數數值滑桿嗎?
interact(f, x=3.0)
interactive(children=(FloatSlider(value=3.0, description='x', max=9.0, min=-3.0), Output()), _dom_classes=('wi…
<function __main__.f(x)>
指定範圍。
interact(f, x=(1, 10))
interactive(children=(IntSlider(value=5, description='x', max=10, min=1), Output()), _dom_classes=('widget-int…
<function __main__.f(x)>
interact(f, x = "輸入你的姓名")
interactive(children=(Text(value='輸入你的姓名', description='x'), Output()), _dom_classes=('widget-interact',))
<function __main__.f(x)>
interact(f, x = ["台北", "台中", "高雄"])
interactive(children=(Dropdown(description='x', options=('台北', '台中', '高雄'), value='台北'), Output()), _dom_class…
<function __main__.f(x)>
interact(f, x = {"台北":1, "台中":2, "高雄":3})
interactive(children=(Dropdown(description='x', options={'台北': 1, '台中': 2, '高雄': 3}, value=1), Output()), _dom…
<function __main__.f(x)>
def move(n=1):
print(" "*n + "⸜(* ॑꒳ ॑* )⸝")
注意 Python 的函式怎麼給預設值。
interact(move, n=(1, 80));
interactive(children=(IntSlider(value=1, description='n', max=80, min=1), Output()), _dom_classes=('widget-int…
x = np.linspace(-10, 10, 500)
def myplot(n=1):
y = np.sinc(n*x)
plt.plot(x, y)
interact(myplot, n=(1., 10.))
interactive(children=(FloatSlider(value=1.0, description='n', max=10.0, min=1.0), Output()), _dom_classes=('wi…
<function __main__.myplot(n=1)>
我們也可以不要那麼及時, 而是「按鈕之後」才執行。這時可以用 interact_manual
, 用法基本上和 interact
一樣!
from ipywidgets import interact_manual
from time import sleep
from IPython.display import clear_output
這裡我們用了兩個套件中的兩個函式, 其中:
sleep(n)
: 要 Python 暫停 n 秒。clear_output()
: 清除 Jupyter Notebook 當前 cell 的東西。def pipi(message):
print("拍拍")
sleep(2)
clear_output()
interact_manual(pipi, message="請輸入你要說的話");
interactive(children=(Text(value='請輸入你要說的話', description='message'), Button(description='Run Interact', style=…
map
篇¶還記得之前我們要把一個串列裡的法郎, 一次全換算成台幣, 需要用迴圈一個個做嗎? 現在我們學會函式的寫法, 可以先寫一個「匯率換算」的程式, 然後用 map
一次把串列中所有的錢換算好!
這次我們到了澳洲, 又是要買三件物品, 價格分別是
200, 450, 35
澳幣。我們又 Google 了一下, 發現 1 澳幣合台幣 21.8686884 元, 於是我們寫個函數來換算一下。
c = 21.8686884
def aud2twd(m):
return c*m
我們來試用一下, 假設我們想知道 100 澳幣合台幣多少。
aud2twd(100)
2186.86884
現在來換算我們三個物品合台幣多少。
price = [200, 450, 35]
map(aud2twd, price)
<map at 0x7ff5484a6a58>
耶? 這什麼意思? 原來我們真的要「看到」, 需要把這個 map
用串列表現出來。
list(map(aud2twd, price))
[4373.73768, 9840.90978, 765.404094]
lambda
: 臨時要使用的函數¶map
看來挺方便的, 不過還是有一個問題, 需要特別去定義一個函數。這麼簡單的函數, 難道不能臨時定義一個嗎? 答案是肯定的, lambda
就是為臨時要用的函數而生。定義方式非常簡單:
list(map(lambda x:c*x, price))
[4373.73768, 9840.90978, 765.404094]
果然一次成功!
filter
篇¶現在我們來討論 filter
。要使用 filter
, 我們需要定義一個輸出為布林值 (Ture/Flase) 的函數。然後用 filter 過濾, 如果一個串列中符合這個要求 (True) 的就留下來, 否則就去掉。
在一個 1-20 的串列中, 我們想找出其中為偶數的數字。
def isEven(n):
if n%2 == 0:
return True
else:
return False
這樣可以檢查是不是偶數, 我們來試試!
isEven(94)
True
isEven(87)
False
濾出偶數!
L = range(1, 21)
L
range(1, 21)
list(filter(isEven, L))
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
果然成功了!
我們可能用 lambda
做這件事嗎?
list(filter(lambda x:x%2==0, L))
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
一樣可以!!